#include "head.h"

//这是一个加密函数
char *encode(request_t *request)
{
    char *jwt;
    
    size_t jwt_length;

    // 初始化编码参数结构体
    struct l8w8jwt_encoding_params params;
    l8w8jwt_encoding_params_init(&params);

    // 设置JWT使用的算法，这里使用HS512
    params.alg = L8W8JWT_ALG_HS512;

    // 设置JWT的主要荷载部分内容:
    // 主题
    params.sub = "project name";
    // 签发者
    params.iss = "serve";
    // 接收方
    params.aud = request->user_name;
    // token过期/有效时间(0x7fffffff:最大值-> 2038年1月19日)
    params.exp = 0x7fffffff;
    // token签发时间
    params.iat = 0;

    // 设置加密密钥
    params.secret_key = (unsigned char*)"this is a code";
    params.secret_key_length = strlen((char *)params.secret_key);

    // 输出变量
    params.out = &jwt;
    params.out_length = &jwt_length;

    // 加密
    l8w8jwt_encode(&params);

    // 输出结果
    // printf("l8w8jwt create token: %s \n",jwt);

    return jwt;
}

//这是一个解密函数
int decode(char *code, char *username)
{
    //接收解密出来的username
    // printf("%s\n",code);


    struct l8w8jwt_decoding_params params;
    l8w8jwt_decoding_params_init(&params);

    // 设置JWT使用的算法，这里使用HS512
    params.alg = L8W8JWT_ALG_HS512;

    params.jwt = (char*)code;
    params.jwt_length = strlen(code);

    // 设置密钥
    char *key="this is a code";
    params.verification_key = (unsigned char*)key;
    params.verification_key_length = strlen(key);

    // 定义: 接收结果的指针和变量
    struct l8w8jwt_claim *claims = NULL;
    size_t claim_count = 0;
    enum l8w8jwt_validation_result validation_result;

    // 解码: 获得token中存储的信息
    int decode_result = l8w8jwt_decode(&params, &validation_result, &claims, &claim_count);

    // 判断是否是正确的token
    if (decode_result == L8W8JWT_SUCCESS && validation_result == L8W8JWT_VALID) {
        // printf("Token validation successful!\n");
        LOG(INFO, "null", "decode", "Token validation successful");

        // 打印token中解码出来的荷载信息
        for (size_t i = 0; i < claim_count; i++) {
            // printf("Claim [%zu]: %s = %s\n", i, claims[i].key, claims[i].value);
            if(strcmp(claims[i].key, "aud") == 0)
            {
                sprintf(username, "%s",claims[i].value);
                // printf("username:%s\n", username);
                LOG(INFO, "null", "decode username", username);
            }
        }

    } else {
        // printf("Token validation failed!\n");
        LOG(ERROR, "null", "decode", "Token validation failed");
    }

    l8w8jwt_free_claims(claims, claim_count);
    return 0;
}

//这是token验证函数
//返回1验证成功，返回0验证失败
int verify_token(request_t *request)
{
    // printf("%s\n", request->token);
    LOG(INFO, request->user_name, "verify_token token", request->token);
   char username[20] = {0};
   // printf("user_name:%s",request->user_name);
   LOG(INFO, request->user_name, "verify_token user_name", request->user_name);
   decode(request->token, username);
   if(strcmp(username, request->user_name) == 0)
   {
       // printf("验证成功\n");
       LOG(INFO, request->user_name, "verify_token", "验证成功");
       return 1;
   }
    // printf("验证失败\n");
    LOG(ERROR, request->user_name, "verify_token", "验证失败");
    return 0;
}
